package ejemplo.sistemas;

import java.awt.Graphics;
import java.util.ArrayList;

import ejemplo.componentes.ComponenteRender;
import ejemplo.componentes.interfaces.IRenderizable;
import es.componentes.Componente;
import es.subsistemas.Subsistema;
/**
 * Subsistema de renderizado.
 * @author Miguel Vicente
 */
public class SubsistemaRenderizado implements Subsistema {
	
	private ArrayList<IRenderizable> componentesRenderizables;
	private Graphics graphics;
	/**
	 * Constructor.
	 * @param componentes ArrayList de componentes a renderizar.
	 */
	public SubsistemaRenderizado(ArrayList<Componente> componentes) {
		this.componentesRenderizables = castComponentesIRenderizable(componentes);
	}

	@Override
	public String getTipo() {
		return ComponenteRender.ID_INTERFAZ;
	}
	
	@Override
	public void procesar(double delta) {
		for (IRenderizable componente : componentesRenderizables) {
			procesarComponente(componente);
		}
	}
	/**
	 * Procesa un componente.<br>
	 * @param componente
	 * @param delta Tiempo transcurrido desde la ultima actualizacion
	 */
	public void procesarComponente(IRenderizable componente) {
		componente.render(graphics);
	}

	public Graphics getGraphics() {
		return graphics;
	}

	public void setGraphics(Graphics graphics) {
		this.graphics = graphics;
	}
	/**
	 * Castea un {@code ArrayList<Componente>} a {@code ArrayList<IRenderizable>}
	 * @param componentes {@code ArrayList<Componente>}
	 * @return {@code ArrayList<IRenderizable>}
	 */
	private ArrayList<IRenderizable> castComponentesIRenderizable(ArrayList<Componente> componentes) {
		ArrayList<IRenderizable> iRenderizables = new ArrayList<IRenderizable>();
		for (Componente componente : componentes) {
			iRenderizables.add((IRenderizable) componente);
		}
		return iRenderizables;
	}

}
